package com.lm.javassist.example;

import javassist.*;

public class JavassistExample {
    public static void main(String[] args) throws Exception {
        // 创建 ClassPool 对象
        ClassPool pool = ClassPool.getDefault();

        // 创建一个新类
        CtClass ctClass = pool.makeClass("com.lm.javassist.DynamicClass");

        // 添加字段
        CtField field = new CtField(CtClass.intType, "value", ctClass);
        field.setModifiers(Modifier.PRIVATE);
        ctClass.addField(field, CtField.Initializer.constant(0));

        // 添加 getter 和 setter 方法
        ctClass.addMethod(CtNewMethod.getter("getValue", field));
        ctClass.addMethod(CtNewMethod.setter("setValue", field));

        // 添加自定义方法
        CtMethod method = new CtMethod(CtClass.voidType, "printValue", new CtClass[]{}, ctClass);
        method.setModifiers(Modifier.PUBLIC);
        method.setBody("{ System.out.println(\"Value: \" + value); }");
        ctClass.addMethod(method);

        // 加载生成的类
        Class<?> dynamicClass = ctClass.toClass();
        Object instance = dynamicClass.getDeclaredConstructor().newInstance();

        // 使用反射调用方法
        dynamicClass.getMethod("setValue", int.class).invoke(instance, 42);
        dynamicClass.getMethod("printValue").invoke(instance); // 输出：Value: 42
    }
}
